#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() 
{
    printf("进程正在运行...\n");
    pid_t id = fork();
    assert(id != -1);
    if(id == 0) 
    {
        //子进程
        sleep(1);
        char *const argv_[] =  
        {
            "ls",
            "-a",
            "-l",
            "--color=auto",
            NULL
        };
        execvp("ls", argv_);
        exit(1); //一定替换失败了，才会执行这句代码
    }
    int status = 0;
    pid_t ret = waitpid(id, &status, 0);//阻塞等待
    if(ret >0) 
    {
        printf("等待成功，退出码：%d, 终止信号：%d\n", (status>>8)&0xFF, status&0x7F);
    }
    return 0;
}


//int main() 
//{
//    printf("进程正在运行....\n");
//    execl("/usr/bin/top", "top", NULL);//所有的execl函数都是以NULL结尾
//    printf("程序运行完成....\n");
//    return 0;
//}

//#include <stdio.h>    
//#include <stdlib.h>    
//#include <string.h>    
//#include <sys/types.h>    
//#include <sys/wait.h>    
//#include <unistd.h>    
//#define NUM 10    
//typedef void (*func_t)();//函数指针    
//func_t handlerTask[NUM];    
//// 样例任务    
//void task1()     
//{    
//    printf("任务1\n");
//}                                                                                                                                                    
//void task2()   
//{                                                                                                                                  
//    printf("任务2\n");                                                                                                               
//}                                                                                                              
//void task3()                                                                                                    
//{                                                   
//    printf("任务3\n");                   
//}                    
//void laodTask()     
//{                   
//    memset(handlerTask,0,sizeof(handlerTask));
//    handlerTask[0] = task1;
//    handlerTask[1] = task2;                
//    handlerTask[2] = task3;
//}                            
//int main() 
//{
//    pid_t id = fork();
//    if(id == 0) 
//    {                                                                                                                                                          
//        //子进程                                             
//        int cnt = 10;
//        while(cnt)    
//        {              
//            printf("我是子进程：%d,父进程：%d,cnt: %d\n",getpid(),getppid(),cnt--);
//           sleep(1);
//        }
//        exit(-1); //进程退出 退出码自己定
//    }
//    //父进程
//    laodTask();                                                                                                                                                
//    int status = 0;
//    while(1)  //使用while循环进行多次检测
//    {
//        pid_t ret = waitpid(id, &status,WNOHANG);//WNOHANG:非阻塞等待-> 子进程没有退出，父进程检测时候，立即返回
//        if(ret == 0)
//        {
//            //waitpid调用成功 && 子进程没退出
//            //子进程没有退出，我的waitpid没有等待失败，仅仅检测了子进程没退出
//            //做其它。。。
//            printf("等待成功，但是子进程还在运行,父进程在运行其它的东西...\n");
//            for(int i = 0; handlerTask[i]!=NULL; ++i) 
//            {
//                handlerTask[i]();  //这里采用回调的方式，父进程在空闲的时候做其它事情
//            }
//        }else if(ret >0)
//        {
//            //waitpid调用成功 && 子进程退出了
//            printf("等待成功, 退出码:%d, 终止信号: %d\n",(status>>8)&0xFF,status & 0x7F);
//            break;
//        }else
//        {
//            //waitpid 调用失败
//            printf("waitpid call failed\n");
//            break;  
//        }
//        sleep(3);
//    }  
//    return 0;
//}





//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//#include <sys/types.h>
//#include <sys/wait.h>
//#include <unistd.h>
//#define NUM 10
//typedef void (*func_t)();//函数指针
//func_t handlerTask[NUM];
//// 样例任务
//void task1() 
//{
//    printf("任务1\n");
//}
//void task2() 
//{
//    printf("任务2\n");
//}
//void task3() 
//{
//    printf("任务3\n");
//}
//void laodTask() 
//{
//    memset(handlerTask,0,sizeof(handlerTask));
//    handlerTask[0] = task1;
//    handlerTask[1] = task2;
//    handlerTask[2] = task3;
//}
//int main() 
//{
//    pid_t id = fork();
//    if(id == 0) 
//    {
//        //子进程
//        int cnt = 10;
//        while(cnt)
//        {
//            printf("我是子进程：%d,父进程：%d,cnt: %d\n",getpid(),getppid(),cnt--);
//            sleep(1);
//        }
//        exit(-1); //进程退出 退出码自己定
//    }
//    //父进程
//    laodTask();
//    int status = 0;
//    while(1)  //使用while循环进行多次检测
//    {
//        pid_t ret = waitpid(id, &status,WNOHANG);//WNOHANG:非阻塞等待-> 子进程没有退出，父进程检测时候，立即返回
//        if(ret == 0)
//        {
//            //waitpid调用成功 && 子进程没退出
//            //子进程没有退出，我的waitpid没有等待失败，仅仅检测了子进程没退出
//            //做其它。。。
//            printf("等待成功，但是子进程还在运行,父进程在运行其它的东西...\n");
//            for(int i = 0; handlerTask[i]!=NULL; ++i) 
//            {
//                handlerTask[i]();  //这里采用回调的方式，父进程在空闲的时候做其它事情
//            }
//        }else if(ret >0)
//        {
//            //waitpid调用成功 && 子进程退出了
//            printf("等待成功, 退出码:%d, 终止信号: %d\n",(status>>8)&0xFF,status & 0x7F);
//            break;
//        }else
//        {
//            //waitpid 调用失败
//            printf("waitpid call failed\n");
//            break;  
//        }
//        sleep(3);
//    }  
//    return 0;
//}
//

//int main() 
//{
//    pid_t id = fork();
//    if(id == 0) 
//    {
//        //子进程
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("我是子进程：%d,父进程：%d,cnt: %d\n",getpid(),getppid(),cnt--);
//            sleep(1);
//        }
//        exit(10); //进程退出 退出码自己定
//    }
//    //父进程
//    // sleep(15);
//    //pid_t ret = wait(NULL);
//    int status = 0;
//    //1.让OS释放子进程的僵尸状态
//    //2.获取子进程的退出结果
//    //在等待期间，子进程没有退出的时候，父进程只能阻塞等待
//    pid_t ret = waitpid(id,&status, 0); //阻塞式等待
//    if(ret > 0)
//    {
//        //是否正常退出
//        if(WIFEXITED(status)) 
//        {
//            //获取进程退出码
//            printf("退出码 ：%d\n", WEXITSTATUS(status));
//        }else
//        {
//            printf("子进程没有正常退出\n");
//        }
//      // printf("等待成功,子进程id:%d, 退出码: %d,终止信号%d\n",ret, (status>>8)& 0xFF,(status & 0x7F));
//    }
//    sleep(5);
//    return 0;
//}

